<?php
include_once ("Smarty.class.php");
/**
 * Controller Gestisce le interazioni tra la vista e il modello
 * @author lucianogrippa
 */
class Controller extends Smarty {
	/**
	 * Classe che gestisce la vista dell'apllicazione
	 * @var View
	 */
	private static $viewInterface;
	/**
	 * Array che contiene la richiesta proveniente dal client
	 * @var Array
	 */
	public $request;
	/**
	 * Inizializza il controller settando i dati di default
	 */
	function __construct() {
		// ottiene l'istanza della classe padre
		parent::__construct ();
		// inizializza la condfigurazione
		$config = new Config ();
		// setta la directory dei template
		$this->setTemplateDir ( $config->smartyTemplateDir );
		//setta la directory di compilazione
		$this->setCompileDir ( $config->smartyTemplateCDir );
		//setta la directory delle configurazioni
		$this->setConfigDir ( $config->smartyConfigDir );
		// setta la directory della cache
		$this->setCacheDir ( $config->smartyCacheDir );
		// configura la cache smarty
		$this->caching = Smarty::CACHING_OFF;
		
		// processa la richiesta
		$this->processRequest ();
	}
	/**
	 * Processa i dati provenienti dalla richiesta,
	 * e li mette in un array
	 * Inoltre la funzione si aspetta dalla richiesta la variabile page se non presente imposta la pagina di default.
	 * La variabile page dovrà essere indicata senza estensione ad esempio page=example
	 */
	private function processRequest() {
		// verifica se è presente la richiesta
		if (isset ( $_REQUEST )) {
			///////////////////
			// variabile page
			///////////////////
			if (isset ( $_REQUEST ["page"] ) && $_REQUEST ["page"] != "" && $_REQUEST ["page"] != null) {
				// ottieni il nome della pagina dalla richiesta
				// nella richiesta sarà indicato solo il nome e non l'estensione
				$page = stripcslashes(strip_tags(($_REQUEST["page"]))) ;
				$this->request ["page"] =$page. ".tpl";
				$this->request ["controller"] = "Controller_" . str_replace("/","_",$page );
			} else {
				// non è presente la pagina nella richiesta imposta la pagina di default
				$this->request ["page"] = "index.tpl";
				$this->request ["controller"] = "Controller_index";
			}
		} else {
			// setta a null i dati della richiesta e imposta la pagina di default
			$this->request ["page"] = "index.tpl";
			$this->request ["controller"] = "Controller_index";
			$this->request ["data"] = "NULL";
		}
	}
	/**
	 * Ottiene il valore di una variabile , se il parametro assign è specifica lo assegna anche al template
	 * 
	 * @param String $varName
	 * @param Boolean $assign
	 * 
	 * @return string valore della variabile assegnata
	 */
	public function GetVal($varName, $assign = false) {
		switch ($varName) {
			case "system_vars" :
				// setta ill nome dell'applicazione
				$this->assign ( 'app_name', APP_NAME );
				// setta la versione
				$this->assign ( 'app_version', APP_VERSION );
				break;
		}
	}
	/**
	 * Processa le richieste provenienti dal client e
	 * chiama la classe per gestire la vista 
	 */
	public static function GetViews() {
		// inizializza la libreria smarty
		Controller::$viewInterface = new View ();
		// interfaccia del controller associata alla pagina
		$fileToLoad = "Controllers" . DIRECTORY_SEPARATOR . Controller::$viewInterface->controller->request ["controller"] . ".php";
		// true se l'interfaccia del controller è stata caricata
		$isInterfaceLoaded = false;
		$interface = null;
		// se è presente carica il controlle associato alla pagina
		// verifica che l'interfaccia esista
		if (file_exists ( $fileToLoad )) {
			// interfaccia esiste chiama il metodo Load
			// includi il file
			include $fileToLoad;
			$isInterfaceLoaded = true;
			// istanzia l'interfaccia
			$stringCall = Controller::$viewInterface->controller->request ["controller"];
			$interface = new $stringCall ();
			// setta il template engine
			$interface->templateEngine = Controller::$viewInterface->controller->smarty;
			// chiama il metodo load
			$interface->Page_Load ();
		}
		Controller::$viewInterface->controller->GetVal ( "system_vars" );
		Controller::$viewInterface->displayPage ();
		// chiama il metodo Page_end
		if ($isInterfaceLoaded) {
			$interface->Page_End ();
		}
	}
}

?>